/*
 * IEventDispatcher.h
 *
 *  Created on: 2013-8-5
 *  Author: xnan
 */

#ifndef XNL_IEVENTDISPATCHER_CLASS_H_
#define XNL_IEVENTDISPATCHER_CLASS_H_

#include <exception>
#include <functional>
#include "base/Object.h"
#include "Event.h"

NS_XNL_BEGIN

class Event;

typedef void (*EventCallback)( Object*, Event* );

/*
 * 事件分派器接口
 * 提供事件的添加，删除，调度接口
 */
class IEventDispatcher
{
public:
    virtual ~IEventDispatcher() = 0;
    
    /*
     * 添加事件监听
     */
    virtual void addEventListener(
            Object * p_target, // 处理事件的目标
            const char * p_eventName, // 事件名称
            XNint p_eventType, // 事件类型
            EventCallback p_callback, // 事件回调函数
            XNbool p_useImmed = false, // 事件是否在接收到之后立刻处理
            XNint p_priority = 0, // 事件优先级
            Object * p_userdata = NULL // 自定义数据
    ) = 0;
    
    /*
	 * 根据不同的尺度删除事件
	 * @param
	 * p_eventName 需要删除的事件名称
	 * p_eventType 需要删除的事件类型;如果为0(默认),则删除所有由p_eventName指定的事件,而不管p_callback的值
	 * p_callbakc  需要删除的事件回调函数;如果为NULL(默认),则删除所有由p_eventName和p_eventType指定的事件
	 */
	virtual void removeEventListener( const char * p_eventName, XNint p_eventType = 0, EventCallback p_callback = NULL ) = 0;
    
	/*
	 * 根据不同的尺度删除事件
	 * @param
	 * p_eventName 需要删除的事件名称
	 * p_eventType 需要删除的事件类型;如果为0,则删除所有由p_eventName指定的事件,而不管p_callback的值
	 * p_callbakc  需要删除的事件回调函数;如果为NULL,则删除所有由p_eventName和p_eventType指定的事件
	 * p_useImmed  需要删除的事件是否直接执行,加上此参数,则还需要匹配此参数才能删除,此参数不管什么情况下都一定会起作用
	 */
    virtual void removeEventListener( const char * p_eventName, XNint p_eventType = 0, EventCallback p_callback = NULL, XNbool p_useImmed = false ) = 0;
    
    /*
     * 调度事件
     */
    virtual void dispatchEvent( Event * p_event ) = 0;
};

NS_XNL_END

#endif /* XNL_IEVENTDISPATCHER_CLASS_H_ */
